package tools;
// transacciones a SQL

//Importando archivo que maneja/gestiona la conexion a la BD
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JComboBox;
import javax.swing.JList;
import m.Model;

public class DatosComboBox extends Model {

    private String DEFAULT_DEPTO = "76";
    public Map<String, String> keyDepto = new HashMap<String, String>();
    public Map<String, String> keyMun = new HashMap<String, String>();
    public Map<String, String> keySexo = new HashMap<String, String>();
    public Map<String, String> keyEspecialidad = new HashMap<String, String>();
    public Map<String, String> keyEstadoMedico = new HashMap<String, String>();
    public Map<String, String> keyTipoDocumento = new HashMap<String, String>();
    public Map<String, String> keyParentesco = new HashMap<String, String>();
    public Map<String, String> keyCitaMotivo = new HashMap<String, String>();
    public Map<String, String> keyCitaEstado = new HashMap<String, String>();
    public Map<String, String> keyDiscapacidad = new HashMap<String, String>();
    public Map<String, String> keyTerapiasPac = new HashMap<String, String>();
    public Map<String, String> keyMedicamentosPac = new HashMap<String, String>();
    public Map<String, String> keyPresentacionMedicamento = new HashMap<String, String>();
    public Map<String, String> keyDiscapacidades = new HashMap<String, String>();
    public Map<String, String> keyTerapias = new HashMap<String, String>();
    private Map<String, String> keyMedidasTiempo = new HashMap<String, String>();
    private Map<String, String> keyMedicamentos = new HashMap<String, String>();
    private Map<String, String> keyRol = new HashMap<String, String>();
    private Map<String, String> keyEstadoUsuario = new HashMap<String, String>();

    /**
     * Llenar ComboBox Departamentos
     *
     * @return String[] del Departamento listo para ser Model
     */
    public String[] cbDepartamento() {
        Object[][] ListaDeptos = sqlDatos("SELECT id_departamento as id_departamento , nombre_dep as nombre_dep FROM departamentos");
        String d = "";
        for (int n = 0; n < ListaDeptos.length; n++) {
            d += ListaDeptos[ n][ 1] + ",";
            keyDepto.put(ListaDeptos[ n][ 1].toString(), ListaDeptos[ n][ 0].toString());
        }
        return d.split(",");
    }

    /**
     * Retorna la Llave Primaria del ComboBox
     *
     * @param cb JCombobox
     * @return PK del Elemento
     */
    public String getKeyDepto(JComboBox cb) {
        return keyDepto.get((String) cb.getSelectedItem());
    }

    /**
     * Llenar ComboBox Ciudad
     *
     * @return String[] de Ciudad listo para ser Model
     */
    public String[] cbCiudad(JComboBox cbDepto) {
        Object[][] ListaMun = sqlDatos("SELECT c.id_ciudad as id_ciudad , c.nombre_ciudad as nombre_ciudad FROM ciudad c , departamentos d WHERE c.id_depto = d.id_departamento AND d. id_departamento = " + getKeyDepto(cbDepto));
        String d = "";
        for (int n = 0; n < ListaMun.length; n++) {
            d += ListaMun[ n][ 1] + ",";
            keyMun.put(ListaMun[ n][ 1].toString(), ListaMun[ n][ 0].toString());
        }
        return d.split(",");
    }

    /**
     * Retorna la Llave Primaria del ComboBox
     *
     * @param cb JCombobox
     * @return PK del Elemento
     */
    public String getKeyMun(JComboBox cb) {
        return keyMun.get((String) cb.getSelectedItem());
    }

    /**
     * Llenar ComboBox cbSexo
     *
     * @return String[] de cbSexo listo para ser Model
     */
    public String[] cbSexo() {
        Object[][] ListaSexo = sqlDatos("SELECT id_sexo as id_sexo , descripcion as descripcion FROM sexo");
        String d = "";
        for (int n = 0; n < ListaSexo.length; n++) {
            d += ListaSexo[ n][ 1] + ",";
            keySexo.put(ListaSexo[ n][ 1].toString(), ListaSexo[ n][ 0].toString());
        }
        return d.split(",");
    }

    /**
     * Retorna la Llave Primaria del ComboBox
     *
     * @param cb JCombobox
     * @return PK del Elemento
     */
    public String getKeySexo(JComboBox cb) {
        return keySexo.get((String) cb.getSelectedItem());
    }

    public String[] cbEspecialidad() {
        Object[][] ListaEsp = sqlDatos("SELECT id_especialidad as id_especialidad , descripcion as descripcion FROM especialidad");
        String d = "";
        for (int n = 0; n < ListaEsp.length; n++) {
            d += ListaEsp[ n][ 1] + ",";
            keyEspecialidad.put(ListaEsp[ n][ 1].toString(), ListaEsp[ n][ 0].toString());
        }
        return d.split(",");
    }

    public String getKeyEspecialidad(JComboBox cb) {
        return keyEspecialidad.get((String) cb.getSelectedItem());
    }

    public String[] cbTipoDocumento() {
        Object[][] ListaEsp = sqlDatos("SELECT id_tipodocumento as id_tipodocumento , descripcion as descripcion FROM tipodocumento");
        String d = "";
        for (int n = 0; n < ListaEsp.length; n++) {
            d += ListaEsp[ n][ 1] + ",";
            keyTipoDocumento.put(ListaEsp[ n][ 1].toString(), ListaEsp[ n][ 0].toString());
        }
        return d.split(",");
    }

    public String getKeyTipoDocumento(JComboBox cb) {
        return keyTipoDocumento.get((String) cb.getSelectedItem());
    }

    public String getValueDpto(String key) {
        System.out.println(key);
        Object[][] result =
                sqlDatos(String.format("select nombre_dep, id_departamento from ciudad, "
                + "departamentos where departamentos.id_departamento = ciudad.id_depto "
                + "and ciudad.id_ciudad = '%s'", key));

        return result.length > 0 ? result[0][0].toString() : null;
    }

    public String getValueCiudad(String key) {
        return getValue(keyMun, key);
    }

    public String getValueEsp(String key) {
        return getValue(keyEspecialidad, key);
    }

    public String getValueTipoDoc(String key) {
        return getValue(keyTipoDocumento, key);
    }

    public String getValueEstado(String key) {
        return getValue(keyEstadoMedico, key);
    }

    private String getValue(Map<String, String> map, String value) {
//        for(Entry<String, String> entry: map.entrySet()){
//            if(value.equals(entry.getValue())){
//                return entry.getKey();
//            }
//        }
//        System.out.println("Size: " + map.size());
//        for(String o: map.keySet()){
//            System.out.println("Value: " + map.get(o));
//            if(value.equals(map.get(o))){
//                return o;
//
//
//    private String getValue(Map<String, String> map, String value) {
        for (Entry<String, String> entry : map.entrySet()) {
            if (value.equals(entry.getValue())) {
                return entry.getKey();

            }
        }
        return null;
    }

    public String[] cbEstado() {
        Object[][] ListaEstado = sqlDatos("SELECT id_estado as id_estado, nombre as nombre FROM estado_medico");
        String d = "";
        for (int n = 0; n < ListaEstado.length; n++) {
            d += ListaEstado[ n][ 1] + ",";
            keyEstadoMedico.put(ListaEstado[ n][ 1].toString(), ListaEstado[ n][ 0].toString());
        }
        return d.split(",");
    }

    public String getKeyEstado(JComboBox cb) {
        return keyEstadoMedico.get((String) cb.getSelectedItem());
    }

    /**
     * Llenar ComboBox Parentesco Familiares
     *
     * @return String[] del Departamento listo para ser Model
     */
    public String[] cbParentesco() {
        Object[][] ListaParentescos = sqlDatos("SELECT  id_parentesco , nombre FROM parentesco");
        String d = "";
        for (int n = 0; n < ListaParentescos.length; n++) {
            d += ListaParentescos[ n][ 1] + ",";
            keyParentesco.put(ListaParentescos[ n][ 1].toString(), ListaParentescos[ n][ 0].toString());
        }
        return d.split(",");
    }

    /**
     * Retorna la Llave Primaria del ComboBox
     *
     * @param cb JCombobox
     * @return PK del Elemento
     */
    public String getKeyParentesco(JComboBox cb) {
        return keyParentesco.get((String) cb.getSelectedItem());
    }

    public String[] cbCitaMotivo() {
        Object[][] ListaMotivos = sqlDatos("SELECT id_motivo_cita as motivo , descripcion FROM motivo_cita");
        String d = "";
        for (int n = 0; n < ListaMotivos.length; n++) {
            d += ListaMotivos[ n][ 1] + ",";
            keyCitaMotivo.put(ListaMotivos[ n][ 1].toString(), ListaMotivos[ n][ 0].toString());
        }
        return d.split(",");
    }

    public String getKeyCitaMotivo(JComboBox cb) {
        return keyCitaMotivo.get((String) cb.getSelectedItem());
    }

    public String getValueCitaMotivo(String key) {
        return getValue(keyCitaMotivo, key);
    }

    public String[] cbCitaEstado() {
        Object[][] ListaEstados = sqlDatos("SELECT id_estado as estado, descripcion FROM estado_cita");
        String d = "";
        for (int n = 0; n < ListaEstados.length; n++) {
            d += ListaEstados[ n][ 1] + ",";
            keyCitaEstado.put(ListaEstados[ n][ 1].toString(), ListaEstados[ n][ 0].toString());
        }
        return d.split(",");
    }

    public String getKeyCitaEstado(JComboBox cb) {
        return keyCitaEstado.get((String) cb.getSelectedItem());
    }

    public String getValueCitaEstado(String key) {
        if (keyCitaEstado.isEmpty()) {
            cbCitaEstado();
        }
        return getValue(keyCitaEstado, key);
    }

    public String[] lDiscapacidades(String id_paciente) {
        Object[][] lDiscapacidad = sqlDatos(String.format("SELECT  distra.id_discapacidad_tratamiento , dis.descripcion||' ('||dis.codigo||')' FROM discapacidad dis , discapacidad_tratamiento distra , tratamiento tra, paciente pac WHERE dis.id_discapacidad = distra.id_discapacidad AND distra.id_tratamiento = tra.id_tratamiento AND tra.id_paciente = pac.id_paciente AND pac.id_paciente = %s", id_paciente));
        StringBuilder d = new StringBuilder();
        for (int n = 0; n < lDiscapacidad.length; n++) {
            d.append(lDiscapacidad[n][1]).append(",");
            keyDiscapacidad.put(lDiscapacidad[ n][ 1].toString(), lDiscapacidad[ n][ 0].toString());
        }
        return d.toString().split(",");
    }

    public String getKeyDiscapacidad(JList l) {
        return keyDiscapacidad.get((String) l.getSelectedValue());
    }

    public String[] lTerapiasPac(String id_paciente, String id_discapacidad_tratamiento) {
        Object[][] lTerapiasPac = sqlDatos(String.format("SELECT ter.id_terapia , ter.nombre FROM terapia ter ,terapia_discapacidad terdis , discapacidad_tratamiento distra , tratamiento tra , paciente pac WHERE ter.id_terapia = terdis.id_terapia AND terdis.id_discapacidad_tratamiento = distra.id_discapacidad_tratamiento AND distra.id_tratamiento = tra.id_tratamiento AND tra.id_paciente = pac.id_paciente AND pac.id_paciente = %s  AND distra.id_discapacidad_tratamiento = %s", id_paciente, id_discapacidad_tratamiento));
        //System.out.println(String.format("lTErapias Paciente \nSELECT ter.id_terapia , ter.nombre FROM terapia ter ,terapia_discapacidad terdis , discapacidad_tratamiento distra , tratamiento tra , paciente pac WHERE ter.id_terapia = terdis.id_terapia AND terdis.id_discapacidad_tratamiento = distra.id_discapacidad_tratamiento AND distra.id_tratamiento = tra.id_tratamiento AND tra.id_paciente = pac.id_paciente AND pac.id_paciente = %s  AND distra.id_discapacidad_tratamiento = %s", id_paciente, id_discapacidad_tratamiento));
        StringBuilder d = new StringBuilder();
        for (int n = 0; n < lTerapiasPac.length; n++) {
            d.append(lTerapiasPac[n][1]).append(",");
            keyTerapiasPac.put(lTerapiasPac[n][1].toString(), lTerapiasPac[n][0].toString());
        }
        return d.toString().split(",");
    }

    public String getKeyTerapiasPac(JList l) {
        return keyTerapiasPac.get((String) l.getSelectedValue());
    }

    public String getValueTerapiasPac(String key) {
        return getValue(keyTerapiasPac, key);
    }

    public String[] lMedicamentosPac(String id_paciente, String id_discapacidad_tratamiento) {
        Object[][] lMediPaci = sqlDatos(String.format("SELECT med.id_medicamento , med.nombre FROM medicamento med , medicamento_discapacidad meddis , discapacidad_tratamiento distra , tratamiento tra , paciente pac WHERE  meddis.id_medicamento = med.id_medicamento AND meddis.id_discapacidad_tratamiento = distra.id_discapacidad_tratamiento AND distra.id_tratamiento = tra.id_tratamiento AND tra.id_paciente = pac.id_paciente AND pac.id_paciente = %s AND distra.id_discapacidad_tratamiento = %s", id_paciente, id_discapacidad_tratamiento));
        StringBuilder d = new StringBuilder();
        for (int n = 0; n < lMediPaci.length; n++) {
            d.append(lMediPaci[n][1]).append(",");
            keyMedicamentosPac.put(lMediPaci[n][1].toString(), lMediPaci[n][0].toString());
        }
        return d.toString().split(",");
    }

    public String getKeyMedicamentosPac(JList l) {
        return keyMedicamentosPac.get((String) l.getSelectedValue());
    }

    public String getValueMedicamentosPac(String key) {
        return getValue(keyMedicamentosPac, key);
    }

    public String[] cbDiscapacidad() {
        Object[][] ListaEstados = sqlDatos("SELECT id_discapacidad, descripcion FROM discapacidad");
        ArrayList<String> d = new ArrayList<String>();

        for (int n = 0; n < ListaEstados.length; n++) {
            d.add(ListaEstados[ n][ 1].toString());
            keyDiscapacidades.put(ListaEstados[n][1].toString(), ListaEstados[n][0].toString());
        }
        return d.toArray(new String[]{});
    }

    public String getKeyDiscapacidad(JComboBox cb) {
        if (keyDiscapacidades.isEmpty()) {
            cbDiscapacidad();
        }
        return keyDiscapacidades.get((String) cb.getSelectedItem());
    }

    public String getValueDiscapacidad(String key) {
        if (keyDiscapacidades.isEmpty()) {
            cbDiscapacidad();
        }
        return getValue(keyDiscapacidades, key);
    }

    public String[] cbTerapias() {
        Object[][] ListaEstados = sqlDatos("SELECT id_terapia, nombre FROM terapia");
        String d = "";
        for (int n = 0; n < ListaEstados.length; n++) {
            d += ListaEstados[ n][ 1] + ",";
            keyTerapias.put(ListaEstados[ n][ 1].toString(), ListaEstados[ n][ 0].toString());
        }
        return d.split(",");
    }

    public String getKeyTerapia(JComboBox cb) {
        return keyTerapias.get((String) cb.getSelectedItem());
    }

    public String getValueTerapia(String key) {
        if (keyTerapias.isEmpty()) {
            cbTerapias();
        }
        return getValue(keyTerapias, key);
    }

    public String[] cbMedidaTiempo() {
        Object[][] ListaEstados = sqlDatos("SELECT id_medida_tiempo, unidad FROM medida_tiempo");
        String d = "";
        for (int n = 0; n < ListaEstados.length; n++) {
            d += ListaEstados[ n][ 1] + ",";
            keyMedidasTiempo.put(ListaEstados[ n][ 1].toString(), ListaEstados[ n][ 0].toString());
        }
        return d.split(",");
    }

    public String getKeyMedida(JComboBox cb) {
        return keyMedidasTiempo.get((String) cb.getSelectedItem());
    }

    public String getValueMedidas(String key) {
        if (keyMedidasTiempo.isEmpty()) {
            cbMedidaTiempo();
        }
        return getValue(keyMedidasTiempo, key);
    }

    public String[] cbMedicamentos() {
        Object[][] ListaEstados = sqlDatos("SELECT id_medicamento, nombre FROM medicamento");
        String d = "";
        for (int n = 0; n < ListaEstados.length; n++) {
            d += ListaEstados[ n][ 1] + ",";
            keyMedicamentos.put(ListaEstados[ n][ 1].toString(), ListaEstados[ n][ 0].toString());
        }
        return d.split(",");
    }

    public String getKeyMedicamentos(JComboBox cb) {
        return keyMedicamentos.get((String) cb.getSelectedItem());
    }

    public String getValueMedicamentos(String key) {
        if (keyMedicamentos.isEmpty()) {
            cbMedicamentos();
        }
        return getValue(keyMedicamentos, key);
    }

    /**
     * Llenar ComboBox Presentacion Medicamento
     *
     * @return String[] del Departamento listo para ser Model
     */
    public String[] cbPresentacionMedicamento() {
        Object[][] listPresentMedic = sqlDatos("SELECT id_presentacion , descripcion FROM presentacion_medicamento");
        String d = "";
        for (int n = 0; n < listPresentMedic.length; n++) {
            d += listPresentMedic[ n][ 1] + ",";
            keyPresentacionMedicamento.put(listPresentMedic[ n][ 1].toString(), listPresentMedic[ n][ 0].toString());
        }
        return d.split(",");
    }

    /**
     * Retorna la Llave Primaria del ComboBox
     *
     * @param cb JCombobox
     * @return PK del Elemento
     */
    public String getKeyPresenMedicamento(JComboBox cb) {
        return keyPresentacionMedicamento.get((String) cb.getSelectedItem());
    }

    public String[] cbRoles() {
        Object[][] ListaRoles = sqlDatos("SELECT id, nombre FROM rol");
        String d = "";
        for (int n = 0; n < ListaRoles.length; n++) {
            d += ListaRoles[ n][ 1] + ",";
            keyRol.put(ListaRoles[ n][ 1].toString(), ListaRoles[ n][ 0].toString());
        }
        return d.split(",");
    }

    public String getKeyRoles(JComboBox cb) {
        return keyRol.get((String) cb.getSelectedItem());
    }

    public String getValueRoles(String key) {
        if (keyRol.isEmpty()) {
            cbRoles();
        }
        return getValue(keyRol, key);
    }
    
    
    public String[] cbEstadoUsuario() {
        Object[][] ListaEstadosU = sqlDatos("SELECT id, nombre FROM estado_usuario");
        String d = "";
        for (int n = 0; n < ListaEstadosU.length; n++) {
            d += ListaEstadosU[ n][ 1] + ",";
            keyEstadoUsuario.put(ListaEstadosU[ n][ 1].toString(), ListaEstadosU[ n][ 0].toString());
        }
        return d.split(",");
    }

    public String getKeyEstadoUsuario(JComboBox cb) {
        return keyEstadoUsuario.get((String) cb.getSelectedItem());
    }

    public String getValueEstadoUsuario(String key) {
        if (keyEstadoUsuario.isEmpty()) {
            cbEstadoUsuario();
        }
        return getValue(keyEstadoUsuario, key);
    }
}
